package org.dxy.trigger.http.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dxy.api.dto.request.materialGroup.CreateMaterialGroupRequest;
import org.dxy.api.dto.request.materialGroup.UpdateMaterialGroupRequest;
import org.dxy.api.response.R;
import org.dxy.infrastructure.entity.query.MaterialGroupViewEntity;

import java.util.List;

/**
 * 物料群组应用服务接口
 * @author dxy
 * @createTime 2025/9/5
 */
public interface MaterialGroupApplicationService {
    
    /**
     * 创建物料群组
     * @param request 创建请求
     * @return 群组ID
     */
    R<Long> create(CreateMaterialGroupRequest request);
    
    /**
     * 更新物料群组
     * @param groupId 群组ID
     * @param request 更新请求
     * @return 操作结果
     */
    R<Void> update(Long groupId, UpdateMaterialGroupRequest request);
    
    /**
     * 启用物料群组
     * @param groupId 群组ID
     * @return 操作结果
     */
    R<Void> enable(Long groupId);
    
    /**
     * 禁用物料群组
     * @param groupId 群组ID
     * @return 操作结果
     */
    R<Void> disable(Long groupId);
    
    /**
     * 删除物料群组
     * @param groupId 群组ID
     * @return 操作结果
     */
    R<Void> delete(Long groupId);
    
    /**
     * 批量删除物料群组
     * @param groupIds 群组ID列表
     * @return 操作结果
     */
    R<Void> batchDelete(List<Long> groupIds);
    
    /**
     * 分页查询物料群组列表
     * @param page 分页参数
     * @param query 查询条件
     * @return 群组列表
     */
    R<Page<MaterialGroupViewEntity>> list(Page<MaterialGroupViewEntity> page, MaterialGroupViewEntity query);
    
    /**
     * 根据ID查询物料群组详情
     * @param groupId 群组ID
     * @return 群组详情
     */
    R<MaterialGroupViewEntity> getById(Long groupId);
    
    /**
     * 根据父群组ID查询子群组列表
     * @param parentGroupId 父群组ID
     * @return 子群组列表
     */
    R<List<MaterialGroupViewEntity>> getByParentGroupId(Long parentGroupId);
    
    /**
     * 查询根级群组列表（树形结构的根节点）
     * @return 根级群组列表
     */
    R<List<MaterialGroupViewEntity>> getRootGroups();
    
    /**
     * 根据群组类型查询群组列表
     * @param groupType 群组类型
     * @return 群组列表
     */
    R<List<MaterialGroupViewEntity>> getByGroupType(String groupType);
    
    /**
     * 查询启用状态的群组列表
     * @return 启用状态的群组列表
     */
    R<List<MaterialGroupViewEntity>> getActiveGroups();
}